package cn.edu.nju.software.cdiy.service;

import java.util.List;
import java.util.Map;

import cn.edu.nju.software.cdiy.bean.Brand;
import cn.edu.nju.software.cdiy.bean.Hardware;
import cn.edu.nju.software.cdiy.bean.HardwareSet;
import cn.edu.nju.software.cdiy.bean.Scheme;
import cn.edu.nju.software.cdiy.util.*;

public interface Service<T extends Hardware> {
	
	public List<Hardware> getNewestList();								//最新的产品列表
	
	public List<Hardware> getHottestList();								//热度最高产品列表
	
	public List<Brand> getBrandList();									//获得所有品牌
	
	/*
	 * 通用筛选方法
	 * map为过滤条件
	 * 不接受性能作为sorttype
	 * 
	 * 当在筛选界面时，hs为null
	 * */
	// map为null 则直接根据hs获得list
	// 筛选和组装时通用
	public List<T> filter(int page,Map<String,List<Integer>> map,SortType st,SortWay sw,HardwareSet hs);
	
	//获得分页的条数
	//筛选的分页
	//若在筛选界面 则hs为null
	//若在组装界面则hs需要赋值
	public int getFilterResultLength(Map<String,List<Integer>> map,HardwareSet hs);
	
	/*
	 * 根据关键字对产品进行搜索
	 * 搜索关键字是和产品型号相关的
	 * 多个关键字之间用空格分隔
	 * */
	public List<T> search(String keywords,int page);				//搜索产品
	
	public Map<String,List<Item>> getFilterBoard();					//获得筛选表单
	
	public T getOneById(int id);									//根据ID获得产品
	
	/*
	 * 包括2种
	 * 1:只是一对一的外键关系
	 * 2:一对多的关系
	 * 对于2,界面上不是下拉框 而是复选框
	 * 
	 * 
	 * 其中还有一种特殊情况，不仅是一对多，而且还要附带数量
	 * 此种情况 传回的参数规格为“num-value”（重要）
	 * num为数量，中间用“-”分隔，value为具体的名称
	 * */
	public Map<String,List<String>> getInsertboard();				//插入硬件界面的外键类型面板
	
	/*
	 * 所有的参数都包装成map类型
	 * 有特殊情况的 已经在上面的注释中提到
	 * 不接受其他类型的参数
	 * */
	public boolean insertHardware(Map<String,List<String>> map);	//插入新的硬件

	public void save(T t);
	
	public List<Scheme> getRelatedSchemes(int hardwareId);
	
	public List<T> getSupplierHarewares(int id);
	
}
